-- OpenWrt Lua MVC 模型基类
-- 版本: 2.5.0
-- 功能: 支持自定义UCI路径、通用CRUD操作、事务管理
-- 依赖: lua-uci (OpenWrt默认集成)

local uci = require("uci")
local util = require("tianku.helpers.util")

local _M = {}
_M.__index = _M

--[[
构造函数
@param config_table : string UCI配置名称 (例如 "udpxy_access")
@param uci_path     : string 自定义UCI路径 (可选)
--]]
function _M.new(config_table, uci_path)
    local self = setmetatable({}, _M)
    
    -- 初始化UCI游标
    self.uci = uci.cursor(uci_path)
    self.config_table = config_table  -- 绑定的UCI配置表名
    
    -- 查询构造器状态
    self._wheres = {}
    self._orders = {}
    self._limit = nil
    
    return self
end

--[[
获取指定配置项
@param section : string 配置节名称
@param option  : string 选项名称
@return 配置值 或 nil
--]]
function _M:get(section, option)
    return self.uci:get(self.config_table, section, option)
end

--[[
设置配置项
@param section : string 配置节名称
@param option  : string 选项名称
@param value   : mixed  要设置的值
--]]
function _M:set(section, option, value)
    self.uci:set(self.config_table, section, option, value)
end

--[[
删除配置项
@param section : string 配置节名称
@param option  : string 选项名称 (可选)
--]]
function _M:delete(section, option)
    if option then
        self.uci:delete(self.config_table, section, option)
    else
        self.uci:delete(self.config_table, section)
    end
end

--[[
遍历配置节
@param callback : function 处理函数 (参数: section)
--]]
function _M:foreach(callback)
    self.uci:foreach(self.config_table, self.config_table, callback)
end

--[[
提交更改到UCI文件
--]]
function _M:commit()
    self.uci:commit(self.config_table)
end

--[[
查询构造器 - WHERE条件
@param field    : string 字段名
@param operator : string 操作符 ("=", "!=", "like"等)
@param value    : mixed  比较值
--]]
function _M:where(field, operator, value)
    if not value then
        value = operator
        operator = "="
    end
    table.insert(self._wheres, {field, operator, value})
    return self
end

--[[
执行查询并返回结果
@return table 结果数组
--]]
function _M:all()
    local results = {}
    
    self:foreach(function(section)
        -- 应用WHERE条件过滤
        for _, condition in ipairs(self._wheres) do
            local field, op, val = unpack(condition)
            local actual = section[field]
            
            if not self:_check_condition(actual, op, val) then
                return false -- 跳过不满足条件的记录
            end
        end
        
        table.insert(results, section)
        
        -- 应用LIMIT限制
        if self._limit and #results >= self._limit then
            return true -- 中断遍历
        end
    end)
    
    -- 应用排序
    if #self._orders > 0 then
        table.sort(results, function(a, b)
            for _, order in ipairs(self._orders) do
                local field, dir = order[1], order[2]
                if a[field] ~= b[field] then
                    return (dir == "asc") and (a[field] < b[field]) or (a[field] > b[field])
                end
            end
            return false
        end)
    end
    
    self:_reset_query() -- 重置查询状态
    return results
end

--[[
获取第一条记录
@return table 或 nil
--]]
function _M:first()
    self._limit = 1
    local result = self:all()
    return result[1]
end

--[[
创建新记录
@param data : table 数据表 {key = value}
@return string 新创建的section名称
--]]
function _M:create(data)
    local section = self.uci:add(self.config_table, self.config_table)
    for k, v in pairs(data) do
        self.uci:set(self.config_table, section, k, v)
    end
    self:commit()
    return section
end

----- 私有方法 -----
function _M:_check_condition(actual, op, expected)
    if op == "=" then
        return actual == expected
    elseif op == "!=" then
        return actual ~= expected
    elseif op == "like" then
        return actual and actual:find(expected) ~= nil
    elseif op == ">=" then
        return tonumber(actual) >= tonumber(expected)
    -- 可扩展其他操作符...
    end
    return false
end

function _M:_reset_query()
    self._wheres = {}
    self._orders = {}
    self._limit = nil
end

return _M